<?php
class factory
{
    private $data=array();
    public $int=1;
    public function production($name)
    {
        echo $this->data[$name];
    }
    public function __set($name, $value)//设置不存在的属性时，此方法会被触发
    {
        // TODO: Implement __set() method.
        //var_export($name);red
        //var_export($value);红颜色的车
        $this->data[$name]=$value;
    }
    public function __get($name)//读取不存在的属性时，此方法会被触发
    {
        // TODO: Implement __get() method.
        //isset(要检查的变量) — 检测变量是否设置,存在并且值不是 NULL 则返回 TRUE
        if (isset($this->data[$name]))
        {
            return  '不存在这辆车';
        }
        return $this->data[$name];

    }
    public function __call($name, $arguments)
    {
        echo $name;
        var_export($arguments);
        // TODO: Implement __call() method.
    }
    public static function __callStatic($name, $arguments)
    {
        echo $name;
        var_export($arguments);// TODO: Implement __callStatic() method.
    }
    public function __toString()
    {
        echo 'hello php';// TODO: Implement __toString() method.
    }
    final public function bb()
    {

    }
}
$factory=new factory();
/*$factory->red='红颜色的车';//设置不存在的属性
$factory->blak='黑颜色的车';
$factory->blue='蓝颜色的车';*/
//$factory->work(3,5,6);
//factory::dsdsd();
echo $factory;


/*$factory->production('red');
echo "<br/>";
$factory->production('blue');*/

/*is_float();
is_array();
is_number();
is_string();
//is_file(规定要检查的文件) 函数检查指定的文件是否是常规的文件。
//如果文件是常规的文件，该函数返回 TRUE
var_export(is_file(__DIR__ . '/ajax/file_manager.ajax.php'));
//is_dir(必需。规定要检查的文件) 函数检查指定的文件是否是一个目录。
//如果目录存在，该函数返回 TRUE。
is_dir();
is_null();
is_uploaded_file();
is_int();
//is_numeric(要检测的变量) 函数用于检测变量是否为数字或数字字符串。
is_numeric();
//echo $factory->red;//读取不存在的属性*/




/*

魔术方法:

__tostring()
echo $factory;当对象被当作字符串输出时，调用该方法。

__invoke
$factory()当对象被当作方法调用时，会调用该方法

__call()
$factory->work()当访问对象的方法不存在时，将会调用该方法

__callStatic($name, $arguments)
factory::dsdsd()当访问类静态方法不存在时，调用该方法

__get()
当访问的属性不能正常访问时（没有该属性或者是private属性），调用该方法

__set()
当要赋值的属性不能正常访问时（没有该属性或者是private属性），调用该方法

__isset()
当不可访问属性调用isset()和empty() 方法时，将会调用。

__unset()
当不可访问属性调用unset() 方法时，将会调用。

__clone()
如下的代码，如果直接使用赋值符号，那么两个变量p1和p2其实是指向同一个对象，如果修改p2，那么p1也会被修改





*/